/**
 * 视频处理工具类
 */

/**
 * 获取视频第一帧作为封面图
 * @param {String} videoUrl - 视频地址
 * @returns {Promise<String>} - 返回封面图的临时路径或base64
 */
export function getVideoFirstFrame(videoUrl) {
  return new Promise((resolve, reject) => {
    // #ifdef H5
    // H5 环境使用 video + canvas 截取
    const video = document.createElement("video");
    video.crossOrigin = "anonymous";
    video.src = videoUrl;
    video.currentTime = 0.1; // 获取 0.1 秒的帧

    video.addEventListener("loadeddata", () => {
      const canvas = document.createElement("canvas");
      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;

      const ctx = canvas.getContext("2d");
      ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

      const imageData = canvas.toDataURL("image/jpeg", 0.8);
      resolve(imageData);

      // 清理
      video.remove();
      canvas.remove();
    });

    video.addEventListener("error", (e) => {
      console.error("视频加载失败:", e);
      reject(new Error("视频加载失败"));
      video.remove();
    });

    video.load();
    // #endif

    // #ifdef MP-WEIXIN || MP-ALIPAY || MP-QQ
    // 小程序环境，创建隐藏的 video 和 canvas
    const videoContext = uni.createVideoContext("video-capture-" + Date.now());

    // 由于小程序限制，这里使用另一种方案
    // 使用 uni.createSelectorQuery 配合 canvas 绘制
    const ctx = uni.createCanvasContext("canvas-capture-" + Date.now());

    // 小程序中较难直接截取，建议使用云函数处理或者用 canvas 绘制占位图
    // 这里返回一个默认图标
    reject(new Error("小程序环境暂不支持直接截取，请使用云函数"));
    // #endif

    // #ifdef APP-PLUS
    // APP 环境，使用 plus API
    const plus = window.plus;

    // 创建 Bitmap 对象
    const bitmap = new plus.nativeObj.Bitmap("video-frame-" + Date.now());

    // APP 环境下截取视频帧比较复杂，建议使用原生插件
    // 这里返回错误，建议使用云函数处理
    reject(new Error("APP环境建议使用云函数处理"));
    // #endif
  });
}

/**
 * 生成视频封面（使用 canvas 绘制占位图）
 * @param {Object} options - 配置项
 * @param {String} options.text - 显示的文字
 * @param {Number} options.width - 宽度（默认 400）
 * @param {Number} options.height - 高度（默认 300）
 * @returns {Promise<String>} - 返回 base64 图片
 */
export function generateVideoCover(options = {}) {
  const {
    text = "视频封面",
    width = 400,
    height = 300,
    bgColor = "#1a1a2e",
    textColor = "#8b5cf6",
  } = options;

  return new Promise((resolve, reject) => {
    // #ifdef H5
    const canvas = document.createElement("canvas");
    canvas.width = width;
    canvas.height = height;

    const ctx = canvas.getContext("2d");

    // 绘制背景
    const gradient = ctx.createLinearGradient(0, 0, width, height);
    gradient.addColorStop(0, "#0a0a0a");
    gradient.addColorStop(1, bgColor);
    ctx.fillStyle = gradient;
    ctx.fillRect(0, 0, width, height);

    // 绘制文字
    ctx.fillStyle = textColor;
    ctx.font = "bold 24px Arial";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillText(text, width / 2, height / 2);

    // 绘制图标
    ctx.font = "48px Arial";
    ctx.fillText("🎬", width / 2, height / 2 - 40);

    const imageData = canvas.toDataURL("image/jpeg", 0.8);
    resolve(imageData);
    canvas.remove();
    // #endif

    // #ifndef H5
    reject(new Error("当前环境不支持"));
    // #endif
  });
}

/**
 * 从视频 URL 获取封面（优先使用缓存）
 * @param {String} videoUrl - 视频地址
 * @param {Object} fallbackOptions - 降级方案配置
 * @returns {Promise<String>} - 返回封面图地址
 */
export async function getVideoCover(videoUrl, fallbackOptions = {}) {
  // 检查是否有缓存
  const cacheKey = "video_cover_" + videoUrl;
  const cached = uni.getStorageSync(cacheKey);
  if (cached) {
    return cached;
  }

  try {
    // 尝试获取第一帧
    const cover = await getVideoFirstFrame(videoUrl);
    // 缓存结果
    uni.setStorageSync(cacheKey, cover);
    return cover;
  } catch (error) {
    console.warn("获取视频第一帧失败，使用占位图:", error);
    // 降级方案：返回视频 URL（让组件自己显示）
    return videoUrl;
  }
}

/**
 * 清除视频封面缓存
 * @param {String} videoUrl - 视频地址（可选，不传则清除所有）
 */
export function clearVideoCoverCache(videoUrl) {
  if (videoUrl) {
    const cacheKey = "video_cover_" + videoUrl;
    uni.removeStorageSync(cacheKey);
  } else {
    // 清除所有视频封面缓存
    const info = uni.getStorageInfoSync();
    info.keys.forEach((key) => {
      if (key.startsWith("video_cover_")) {
        uni.removeStorageSync(key);
      }
    });
  }
}

export default {
  getVideoFirstFrame,
  generateVideoCover,
  getVideoCover,
  clearVideoCoverCache,
};

